home *** CD-ROM | disk | FTP | other *** search
- Especificaciones para la librería MOUSE.H
- -----------------------------------------
- (C) Anubis Software, todos los derechos sobre este documento están
- reservados.
-
- Esta librería está especialmente orientada al uso del ratón.
- Tiene una gran diversidad de funciones que proporcionan todo tipo
- de servicios, tanto para modo gráfico, como para modo texto.
-
- Para que funcione correctamento no se puede utilizar la opción FASTEST CODE
- del compilador, pues la aplicación se colgará con suma facilidad
- (debido al uso de interrupciones)
-
-
- Constantes de la librería:
- --------------------------
-
- Constantes de estado:
- ---------------------
-
- BUTTON_LEFT: Esta constante establece que el botón izquierdo está
- pulsado.
- BUTTON_RIGHT: Esta constante establece que el botón derecho está
- pulsado.
- BUTTON_MIDDLE: Esta constante establece que el botón central está
- pulsado.
-
- Constantes de evento:
- ---------------------
- Cuando se produce un evento, puede ser de diversos tipos. Y esán
- todos ellos definidos con las siguientes constantes.
-
- MOVER_RATON: Se ha movido el ratón.
- PULSAR_IZQUIERDO: Se ha pulsado el botón izquierdo del ratón.
- SOLTAR_IZQUIERDO: Se ha soltado el botón izquierdo del ratón.
- PULSAR_DERECHO: Se ha pulsado el botón derecho del ratón.
- SOLTAR_DERECHO: Se ha soltado el botón derecho del ratón.
- SHIFT_PULSADO: Se mantiene la tecla Shift pulsada.
- CTRL_PULSADO: Se mantiene la tecla Crtl pulsada.
- ALT_PULSADO: Se mantiene la tecla Alt pulsada.
- PULSAR_CENTRO: Se ha pulsado el botón central.
- SOLTAR_CENTRO: Se ha sotado el botón central.
-
- // Existen eventos especiales que son detectados mediante software:
- DOBLE_CLICK_DERECHO: Doble pulsación del botón derecho
- DOBLE_CLICK_IZQUIERDO: Doble pulsación del botón izquierdo.
-
- Existen algunos tipos predefinidos del ratón:
- typedef struct {
- WORD despx; Indica el desplazamiento del pixel de valor respecto
- a la esquina superior izquierda. debe tener un valor entre 0 y 16
- WORD despy; Igual que despx, pero respecto al eje y.
- WORD buffer[32]; Contiene dos dibujos del ratón. La primera zono de
- 16 WORD's debe tener la máscara con AND del dibujo y la segunda
- zona debe tener una máscara con XOR del dibujo.
- } PUNT_RATON;
-
- La estructuera PUNT_RATON se utiliza para definir tipos de cursores
- del ratón en modo gráfico.
-
- typedef struct {
- int posx; Es la posición horizontal del ratón en pixels.
- int posy; Es la posición vertical del ratón en pixels.
- int estado; Es un bit que indica el estado del ratón; Puede tomar
- los valores BUTTON_LEFT, BUTTON_RIGHT y BUTTON_MIDDLE en una máscara.
- } MOUSE_INFO;
-
- La estructura MOUSE_INFO se utiliza para centralizar todas las variables
- del ratón.
-
-
- Declaración de las variables globales de la librería:
-
- void far *mouseoldroutine;
- --------------------------
- Esta variable no debe ser nunca modificada por el usuario directamente
- contine el valor de la rutina anterior para controlar el ratón antes
- de utilizar las funciones InitMouse o similares.
- Para el usuario de la librería esta rutina no existe.
-
- volatile WORD mousex;
- ---------------------
- Esta variable, siempre que se haya inicializado correctamente el
- ratón, contiene la posición horizontal del puntero de ratón en
- pixels.
- La inicialización del ratón se debe hacer con InitMouse.
-
- volatile WORD mousey;
- ---------------------
- Esta variable, siempre que se haya inicializado correctamente el
- ratón contiene la posición vertical del puntero de ratón en
- pixels.
-
- volatile WORD estado;
- ---------------------
- Esta variable contiene, siempre que se haya inicializado correctamente
- el ratón el estado de los botones del ratón. Puede contener los
- valores BUTTON_LEFT, BUTTON_RIGHT o BUTTON_MIDDLE en una máscara.
- Indicando cada un de dichos valores que el botón correspondiente está
- siendo pulsado en esos momentos.
- Un ejemplo de uso de esta forma sería el siguiente:
- while (estado & BUTTON_LEFT) {
- puts("El botón izquierdo del ratón está pulsado");
- }// end while
- o el siguiente
- while (estado == BUTTON_LEFT) {
- puts("El botón izquierdo del ratón está pulsado");
- }// end while
- NOTA: Esta variable, aunque existe, no se suele utilizar, pués directamente
- se usa mouse_evento.
-
- volatile WORD mouse_evento;
- ---------------------------
- Esta variable, según como se haya inicializado el ratón contiene
- el último evento que se ha producido en el ratón. Estos pueden
- ser todos los descritos en las constantes de evento.
-
- void far (*EventMouseRoutines[10]) (void);
- ------------------------------------------
- Esta variable es un array para utilizar el ratón con el sistema
- de gestion de eventos. No es aconsejable, ni útil el que sea
- manipulada directamente.
- NOTA: Olvidese que existe esta declaración.
-
- char EventMouseIndiceRutinas;
- -----------------------------
- Esta variable es un apuntador sobre la variable anterior y tampoco
- debe manipularse directamente.
-
- char EventMouseIndiceAuxiliar;
- ------------------------------
- Igual que la anterior.
-
- int double_click_delay;
- -----------------------
- Establece el tiempo para detectar pulsaciones dobles.
-
-
- void far (*EventMouseFastRoutines[10])(void);
- ---------------------------------------------
- Existen dos colas de ejecución para eventos del ratón; una se dedica a
- la gestión de eventos de carga pesada, y la otra se dedica a la gestión de
- los eventos con carga ligera; Esto significa que los eventos de esta pila
- se ejecutan siempre, incluso cuando se esta en el interior de algún algoritmo
- que se ha cerrado en torno a la gestión de eventos.
- Es similar a EventIddleExecutión, salvo que sucede con el ratón y no como
- norma general.
-
- char EventMouseIndiceFastRutinas;
- ---------------------------------
- Es una variable auxiliar para EventMouseFastRoutines.
-
- char EventMouseIndiceFastAuxiliar;
- ----------------------------------
- Es una variable auxiliar para EventMouseFastRoutines.
-
- char EventMouseFastSkip;
- ------------------------
- Es una variable auxiliar para EventMouseFastRoutines.
-
- boolean nevent
- --------------
- Esta variable, también es una variable auxilair para EventMouseFasRoutines
- y lo que indica es que el evento de ratón que acontece es nuevo. Se utiliza
- porque La ejecución rápida de rutinas no puede bajo ningún concepto variar
- el valor de mouse_evento, ya que después es utilizado por EventMouseRoutines.
-
-
- Funciones proporcionadas por la librería:
- -----------------------------------------
- void ConvertMouse(void)
- -----------------------
- Esta función convierte los eventos simples de ratón en eventos completos
- de ratón. Asi, cuando se ha llamado a esta función, la variable mouse_event
- puede contener dos nuevos eventos;
- DOBLE_CLICK_DERECHO y DOBLE_CLICK_IZQUIERDO son los eventos que se han
- añadido a los eventos producidos por hardware.
- Esta función consume como recursos el tiempo especificado en double_click_delay
- ya que utiliza un espacio de tiempo para comprobar si se ha producido una
- doble pulsación y eliminar la pulsación simple para provocar una pulsación
- doble. (Es sencillo, pero debe consumir tiempo).
- La función utiliza la función delay() de la librería dos.h
-
- void EventMouseFastExecution(void);
- -----------------------------------
- Esta llamada provoca que se ejecuten todos los eventos del ratón que
- se han solicitado. Es práctica y util ya que centraliza los eventos del ratón
- y no se debe estar haciendo polling siempre. Los eventos que ejecuta esta
- rutina son los rápidos. "Es decir" los que se ejecutarán siempre aun cuando
- se este en un procedimiento que ha absorbido las funciones. Esto significa
- que siempre que se produce un evento de ratón, pasará por esta función.
- Es importante destacar que las funciones que reciben este evento no deben
- bajo ninguna circunstancia modificar el valor de mouse_event, ya que el
- evento deberá pasar después a las funciones normales (no fast).
- Antes de nada, esta función llama a la función ConvertMouse porque los
- eventos que se tratan son completos, los producidos por software también.
- Por todo lo demás, el funcionamiento es analogo el que hace la ejecución
- de eventos de ratón normal.
-
- void EventMouseExecution(void);
- -------------------------------
- Provoca la ejecución de todas las funciones almacenadas en la
- pila de ejecución de la pila de eventos del ratón. Dichas funciones
- contienen tratamientos del ratón. Y deben meterse en la pila mediante
- la función EventEmpilaMouseRutina(...)
- Sólo se ejecutan dichas funciones cuando se ha producido un evento
- de ratón. Lo cual proporciona una eficiencia mayor y una centralización
- de todo el sistema. Haciendo que el OverHead sea menor que el dado
- al hacer un poling sobre el ratón en todas las funciones que lo
- desean utilizar.
- Esta función llama automaticamente a EventMouseFastExecutión. Lo cual
- significa que se procesan todos los eventos producidos. Rápidos y no rápidos.
- Los eventos tratados son todos, tanto hardware como software.
-
- void EventMouseFinFastExecution(void);
- void EventMouseFinExecution(void);
- ----------------------------------
- Provoca el fin de ejecución de las funciones del ratón sin ejecutar
- las posteriores a la que se ha ejecutado. Esta función sólo debe ser
- utilizada por las funciones que estén dentro de la pila de ejecución.
- Su manejo es eficaz y proporciona una forma adecuada de controlar
- el flujo de ejecución de las rutinas del ratón. Además permite
- jerarquias en las funciones de eventos del ratón.
-
- void MouseSkipFastExecution(void);
- void MouseSkipExecution(void);
- ------------------------------
- Provoca el fin de ejecución de las funciones del ratón, pero no
- elimina el último evento del ratón que ha provocado la ejecución. Con
- lo cual se volverá a ejecutar toda la pila de funciones de nuevo.
-
- void EventEmpilaMouseFastRutina( void far (*) (void));
- void EventEmpilaMouseRutina( void far (*) (void));
- --------------------------------------------------
- Esta función empila una rutina de ejecución de eventos de ratón
- en la pila de eventos del ratón. Dicha función se ejecutará siempre
- que se produzca un evento del ratón.
-
- void EventDesempilaMouseFastRutina();
- void EventDesempilaMouseRutina();
- ---------------------------------
- Esta función desempila la última función que se ha metido en la
- pila de ejecución. Normalmente no se utiliza.
-
-
- void interrupt MouseEvent();
- ----------------------------
- Esta rutina es el gestor de interrupciones que se coloca como
- manipulador de la librería. Se coloca en su sitio cuando se llama
- a la funcion InitMouse();
- Es esta función la que se encarga de que las variables mouse_evento,
- mousex, mousey y estado tengan lo que les corresponde tener.
- NOTA: Esta rutina no debe utilizarse nunca, es decir que para el
- usuario no existe.
-
- void InitMouse(int);
- --------------------
- Esta función inicializa el ratón. Para poder funcionar con las
- variables mousex, mousey, etc.
- La función sólo debe llamarse una vez en todo el programa, a no
- ser que se la finalice con la funcion MouseOff.
- El parámetro que se le pasa es un valor indicando los eventos que
- deben considerarse como eventos. (Vease Extensiones del MS-DOS para
- una completa definición de las máscaras). Normalmente los valores
- más utilizados son 0x7E y 0x7F.(Que implican todos los eventos del ratón).
-
- void MouseOFF(void);
- --------------------
- Desactiva la instalación del raton con InitMouse();
-
- void show_mouse(void);
- ----------------------
- Hace que el puntero del ratón sea visible.
-
- void ide_mouse(void);
- ---------------------
- Hace que el puntero del ratón sea invisible.
-
- void pos_mouse(x, y);
- ---------------------
- int x;
- int y;
-
- Establece la posición del ratón a las coordenadas (x,y). Estas
- coordenadas están en pixels incluso en los modos de texto donde hay
- que aplicar un factor de conversión multiplicando por 8 dichos valores.
-
- void tasa_int_mouse(int);
- -------------------------
- int int;
-
- Establece el númer de veces que se testea el ratón para producir
- la interrupción adecuada. No es necesario usarla.
-
- void pagina_mouse( pag);
- ------------------------
- int pag;
-
- Establece la página de visualización del ratón. Por defecto es la
- página 0 y no suele ser necesario cambiarla, a no ser que se utilice
- otra página de visualización para la pantalla. Cosa muy poco frecuente.
-
- struct mouse inf_mouse(void);
- -----------------------------
- Devuelve una estructura del tipo INF_RATON rellena de los datos
- actuales del ratón. No se usa si se emplean las variables de estado
-
- int boton_mouse(void);
- ----------------------
- Devuelve una variable con el estado de los botones del ratón. Tampoco
- se usa.
-
-
- struct mouse inf_suelta_mouse(int ,int *, int *,int *);
- ---------------------------------------------------------
- En realidad no se utiliza con el sistema de las variables.
-
- struct mouse inf_pulsa_mouse(int ,int *, int *,int *);
- ------------------------------------------------------
- En realidad no se utiliza con el sistema de las variables.
-
- void init_mouse(void);
- ----------------------
- Es otra forma de inicializar el ratón, de hecho, sirve para inicializar
- el ratón y no utilizar las variables mousex,mousey,...
- Está bastante obsoleta ya que es una forma retrasada de controlar el ratón.
-
- void init_double_click (void);
- ------------------------------
-
- int test_double_click(void);
- ----------------------------
-
- void limit_horizontal_area_raton(int ,int );
- --------------------------------------------
- Limita las areas del ratón.
-
- void seleccionar_puntero_texto(int ,int ,int );
- -----------------------------------------------
-
- void cambiar_puntero_grafico(PUNT_RATON );
- ------------------------------------------
-
- PUNT_RATON leer_puntero_raton(char *);
- --------------------------------------
-
- void grabar_puntero_raton (char *, PUNT_RATON );
- ------------------------------------------------
-
-
-
-
- NOTAS PARA LAS FUNCIONES DE EJECUCION DE VENTOS:
- ------------------------------------------------
-
- -El uso del ratón por parte de todas las funciones es bastante
- generalizado. Si se produce un evento, entonces todas las funciones
- comprueban si el evento les pertenece, o es el evento que las dispara
- y en dicho caso ejecutan el código que les pertoca.
-
- -Ciertas funciones necesitan retener el uso del ratón por un
- tiempo determinado. Por ejemplo el caso de funciones que se ejecutan
- mientras un boton del ratón está pulsado. Estas funciones son factibles
- siempre y cuando se apropien del ratón, o finalicen la ejecución del
- mismo cuando han terminado con el. Ya que si no producen un estado
- fantasma que no ha activado a los demás eventos y puede conllevar a
- la ejecución de rutinas no activadas correctamente.
-
- -A veces nos interesará anular la ejecución de las demás funciones
- sin que se termine la ejecución de las mismas. Es decir, apropiarnos
- del evento del ratón que ha sucedido, pero sin castrar la ejecución de
- las demás funciones. Esto se consigue de una forma muy sencilla.
- Basta con asignar a la variable mouse_evento un cero y nos aseguramos
- que las demás funciones no tomen el evento del ratón como suyo. Ya
- que todas deben comprobar que tipo de evento se ha producido y
- no detectarán evento alguno. Así la ejecución proseguirá hasta el
- final sin provocar que dos funciones se apropien del mismo evento.
- También se puede conseguir con la funcion EventMouseFinExecution.
-
- -Se ha observado que existen dos colas de ejecución para eventos del
- ratón. Esto es debido a que en las aplicaciones que utilizen el sistema
- AVISION pueden querer que ciertas rutinas no se interrumpan cuando un
- determinado procedimiento se ha apropiado del ratón. Esto implica que
- ese procedimiento ejecute EventMouseFastExecution y que no se ejecute
- EventMouseExecution. (Para mayor información leanse documentos sobre
- el sistema AVISION (Anubis Vision) )